"""系统启动脚本.

本脚本用于初始化和启动信用风险控制系统(CRCS),主要功能包括:
1. 系统健康检查
2. 数据库初始化
3. 服务器配置和启动
"""

import argparse
import sys
from pathlib import Path

import uvicorn
from src.crcs.data.db_manager import DatabaseManager
from src.crcs.utils.logger import logger
from src.crcs.utils.system import SystemMonitor


def init_system():
    """初始化系统组件.
    
    执行以下初始化步骤:
    1. 检查系统资源健康状况(CPU、内存、磁盘等)
    2. 验证数据库连接
    3. 初始化数据库架构
    
    如果任何初始化步骤失败,程序将终止运行.
    """
    try:
        # 系统健康检查
        system_monitor = SystemMonitor()
        is_healthy, warnings = system_monitor.check_system_health()
        
        if not is_healthy:
            logger.warning("系统健康检查发现以下警告:")
            for warning in warnings:
                logger.warning(f"- {warning}")
        
        # 数据库初始化
        db_manager = DatabaseManager()
        if not db_manager.check_connection():
            logger.error("无法连接到数据库,请检查数据库配置和状态")
            sys.exit(1)
            
        if not db_manager.init_database():
            logger.error("数据库初始化失败,请检查数据库权限和迁移脚本")
            sys.exit(1)
        
        logger.info("系统初始化成功完成")
        
    except Exception as e:
        logger.error(f"系统初始化过程发生错误: {e}")
        sys.exit(1)


def main():
    """主函数,解析命令行参数并启动服务器."""
    parser = argparse.ArgumentParser(description="信用风险控制系统管理器")
    
    # 服务器绑定地址
    parser.add_argument(
        "--host",
        default="0.0.0.0",
        help="服务器绑定的IP地址"
    )
    
    # 服务器端口
    parser.add_argument(
        "--port",
        type=int,
        default=8000,
        help="服务器绑定的端口号"
    )
    
    # 开发模式自动重载
    parser.add_argument(
        "--reload",
        action="store_true",
        help="启用代码自动重载(开发模式)"
    )
    
    # 工作进程数
    parser.add_argument(
        "--workers",
        type=int,
        default=1,
        help="工作进程数量(生产环境建议设置为CPU核心数)"
    )
    
    args = parser.parse_args()
    
    # 系统初始化
    init_system()
    
    # 启动服务器
    logger.info(f"正在启动服务器 - 地址:{args.host} 端口:{args.port}")
    uvicorn.run(
        "src.crcs.api.main:app",
        host=args.host,
        port=args.port,
        reload=args.reload,
        workers=args.workers
    )


if __name__ == "__main__":
    main()